"""
2017.05.31
Python关于File IO 的使用

"""
import os
import sys


def print_lol(the_list, indent=False, level=0, fh=sys.stdout):
    for e in the_list:
        if isinstance(e, list):
            print_lol(e, indent, level + 1, fh)
        else:
            if indent:
                for tab_stop in range(level):
                    print("\t", end='', file=fh)
            print(e, file=fh)


def read_file():
    """
    读文件
    :return:
    """
    man = []  # 空列表
    other = []  # 空列表
    try:
        data = open('sketch.txt')
        for line in data:
            # if line.find(':') is not -1:
            try:
                (role, line_spoken) = line.split(':', 1)
                # 除去空白符后的字符串，再赋回到自身
                line_spoken = line_spoken.strip()
                # 根据某人讲话，更新列表
                if role == 'Man':
                    man.append(line_spoken)
                # elif表示else if
                elif role == 'Other Man':
                    other.append(line_spoken)
            except ValueError:
                pass
        data.close()
    except IOError:
        print('The data is missing')
    print(man)
    print(other)

    try:
        # 将列表保存到文件。
        # 使用模式 w  - 表示若文件已经存在，则会清空已经存在的内容。
        # 使用模式 w+ - 表示若文件已经存在，则会追加内容。
        with(open('man_data.txt', 'w')) as man_file:
            print_lol(man, fh=man_file)
        with(open('other_data.txt', 'w')) as other_file:
            print_lol(other, fh=other_file)
            # 此处代码的问题是： 若执行到这里挂掉了，则后面的 file close 就不会被执行 File会一直被占用
            # 改进方法是使用 finally，在 finally中将文件关闭
            # man_file.close()  # 不要忘记关闭文件，确保所有数据都保存到磁盘，这称之为刷新 flush
            # other_file.close()
    except IOError as err:  # 处理IO 异常
        print('IOError: ' + str(err))


# 测试读文件
read_file()
